package editorsvg.editor.formas;

import editorsvg.propiedades.GrupoPropiedades;
import editorsvg.propiedades.PropiedadTextoMultilinea;
import java.awt.Shape;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import org.apache.batik.parser.DefaultPathHandler;
import org.apache.batik.parser.PathHandler;
import org.apache.batik.parser.PathParser;

/**
 * Forma que representa un trayecto.
 * @author Jorge Berjano
 */
public class Trayecto extends Forma {

    private List<NodoTrayecto> nodos = new ArrayList<NodoTrayecto>();
    private Path2D path = new Path2D.Double();
    
    private boolean regenerarNodos;
    private GrupoPropiedades grupoPropiedades;
    
    private String datos = "";

    @Override
    public String getNombreTag() {
        return "path";
    }

    @Override
    public GrupoPropiedades obtenerPropiedades() {
        if (grupoPropiedades == null) {
            grupoPropiedades = new GrupoPropiedades("Trayecto");
            grupoPropiedades.agregarPropiedad(new PropiedadTextoMultilinea(this, "datos", "d"));
        }
        return grupoPropiedades;
    }

    @Override
    public Shape getShape() {
        return path;
    }

    @Override
    public void actualizar() {
        if (regenerarNodos) {
            parsearDatos();
        }
    }

    public String getDatos() {
        return datos;
    }

    public void setDatos(String datos) {
        this.datos = datos;
        regenerarNodos = true;
    }

    public void agregar(NodoTrayecto nodo) {
        nodos.add(nodo);
    }

    public void actualizarPath() {
        path.reset();
        for (NodoTrayecto nodo : nodos) {
            nodo.agregarAlPath(path);
        }
    }

    public NodoTrayecto getNodo(int indice) {
        if (indice >= 0 && indice < nodos.size()) {
            return nodos.get(indice);
        } else {
            return null;
        }
    }
    
    /**
     * Parsea el atributo datos generando la lista de nodos.
     */
    private void parsearDatos() {
        try {
            nodos.clear();
            if (datos == null) {
                return;
            }

            PathParser parser = new PathParser();
            PathHandler handler = new DefaultPathHandler() {

                @Override
                public void startPath() throws org.apache.batik.parser.ParseException {
                    
                }

                
                @Override
                public void linetoAbs(float x, float y) throws org.apache.batik.parser.ParseException {
                    NodoTrayecto nodo = new NodoTrayecto(NodoTrayecto.TipoNodo.RECTA, new Point2D.Double(x, y));
                }

                @Override
                public void linetoRel(float x, float y) throws org.apache.batik.parser.ParseException {
                   // super.linetoRel(arg0, arg1);
                }
                
                

//                @Override
//                public void point(float x, float y) throws ParseException {
//                    nodos.add(new Point2D.Double(x, y));
//                }
            };
            parser.setPathHandler(handler);
            parser.parse(datos);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
